package com.chenlehao.controller;

import com.chenlehao.projo.result;
import com.chenlehao.projo.userProjo;
import com.chenlehao.service.impl.servicesA;
import com.chenlehao.service.services;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;


// 修饰请求类
@RestController
@ResponseBody
public class userController {
    // 此条注释表示当浏览器调用这个地址时, 会执行以下方法
    @RequestMapping("/get")
    public String hello(@RequestParam(name = "name") String username, int age) {
        // name和age代表请求的传参, 请求时候的参数名必须和声明的一致, 否则为null
        // 如果想要不一致, 可以通过@RequsetParam注解
        /* @RequestParam
        * 1.可以重命名接受的参数
        * 2.默认有required属性, 客户端必传参数, 不传报错
        * */
        System.out.println("姓名"+username);
        System.out.println("年龄"+age);
        return "Hello World";
    }

    @RequestMapping("/set")
    public String setUser(userProjo user){
        // 实体类接收参数
        System.out.println(user.getName());
        System.out.println(user.getAge());
        return "设置成功";
    }

    @RequestMapping("/arr")
    public String getArr(String[] hobby) {
        // 数组的形式传参
        System.out.println(Arrays.toString(hobby));
        return "hello";
    }

    @RequestMapping("/list")
    public String getList(@RequestParam() List<Integer> hobby) {
        // 如果传参没有按照集合的数据类型传,则会报400的错误
        // 集合的形式传参
        System.out.println(hobby.get(0)+hobby.get(1));
        return "hello";
    }

    @RequestMapping("/date")
    public String getDate(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime) {
        // DateTimeFormat 声明接受的时间格式
        System.out.println(updateTime);
        return "ok";
    }

    // json格式传参
    @RequestMapping("/json")
    public String getDate(@RequestBody() userProjo user) {
        // json格式参数也需要用实体类接收
        System.out.println(user);
        return "ok";
    }

    // 路径传参
    @RequestMapping("/path/{id}/{name}")
    public String getPath(@PathVariable() int id, @PathVariable() String name) {
        // 路径传参
        System.out.println(id+name);
        return "ok";
    }

    // 统一的响应结果
    @RequestMapping("/api")
    public result realApi(int sex){
        // sex必须是0-1(男或女)
        if(sex != 1 && sex != 0){
            return result.error("sex传参只能是0/1(男或女)");
        }
        return result.success();
    }

    // 注入一个bean, 好处是不用再写new以及后面的类, 降低了耦合性
    // 相当于 private services ser = new servicesA() 的写法, 只是servicesA由 @Component 控制, 修饰哪个类, new的就是实现类
    @Autowired // 运行时, ioc容器会提供一个bean对象, 并赋值给该变量
    private services ser;

    // 解耦
    @RequestMapping("/all")
    public result all(){
        return result.success(ser.getStr());
    }
}
